//
//  bleCentralManager.h
//  MonitoringCenter
//
//  Created by David ding on 13-1-10.
//
//

#import <CoreBluetooth/CoreBluetooth.h>
#import "BLEPeripheral.h"
#import "BLEControllerDelegate.h"

/**
 *  加工数据代理
 */
@protocol BLECentralManagerProcessDataDelegate <NSObject>

/**
 *  加工数据
 *
 *  @param data 原始数据
 *
 *  @return 处理完毕的数据:若返回nil则表示不发本条数据，
 *          若返回不为nil则BLECentralManager向所有代理发送bleReceivedData方法
 */
-(NSData *)processData:(NSData *)data;

@end

/**
 *  中心设备状态
 */
typedef NS_ENUM(NSInteger , BLECentralDelegateState) {
    // 中心设备事件状态
    BLECentralDelegateStateRetrievePeripherals = 0,
    BLECentralDelegateStateRetrieveConnectedPeripherals,
    BLECentralDelegateStateDiscoverPeripheral,
    BLECentralDelegateStateConnectPeripheral,
    BLECentralDelegateStateFailToConnectPeripheral,
    BLECentralDelegateStateDisconnectPeripheral,
    BLECentralDelegateStatePeripheralRSSIChange,
    // 中心设备初始状态
    BLECentralDelegateStateCentralManagerResetting,
    BLECentralDelegateStateCentralManagerUnsupported,
    BLECentralDelegateStateCentralManagerUnauthorized,
    BLECentralDelegateStateCentralManagerUnknown,
    BLECentralDelegateStateCentralManagerPoweredOn,
    BLECentralDelegateStateCentralManagerPoweredOff,
};

/**
 *  BLECentralManager 类负责创建CBCentralManager（中心设备管理）并处理其回调方法。
 */
@interface BLECentralManager : NSObject

//扫描到的外围设备
@property(strong, nonatomic,readonly) NSMutableArray<BLEPeripheral *> *peripherals;
//已连接的外围设备
@property(strong, nonatomic) BLEPeripheral *activePeripheral;
//中心设备状态
@property(readonly,assign) BLECentralDelegateState currentCentralManagerState;
//当前连接的蓝牙设备名称
@property(strong, nonatomic,readonly) NSString *currentConnectedDeviceName;
//烧录固件时使用
@property (nonatomic, assign) BOOL isBootloader;
//加工数据代理
@property (nonatomic, weak) id<BLECentralManagerProcessDataDelegate> processDataDelegate;
//是否开启log
@property (nonatomic, assign) BOOL enbaleLog;

/**
 *  单例
 *
 *  @return 单例
 */
+(BLECentralManager*)sharedManager;

/**
 *  开始扫描(按UUID进行扫描)
 */
-(BOOL)startScanning;

/**
 *  停止扫描
 */
-(void)stopScanning;

/**
 *  重置扫描
 */
-(BOOL)resetScanning;

/**
 *  增加代理
 *
 *  @param delegate 代理
 */
-(void)addDelegate:(id<BLEControllerDelegate>)delegate;

/**
 *  移除代理
 *
 *  @param delegate 代理
 */
-(void)removeDelegate:(id<BLEControllerDelegate>)delegate;

/**
 *  开始连接
 *
 *  @param peripheral 外部涉笔
 */
-(void)connectPeripheral:(CBPeripheral*)peripheral;

/**
 *  断开连接
 *
 *  @param peripheral 外部设备
 */
-(void)disconnectPeripheral:(CBPeripheral*)peripheral;

/**
 *  断开当前连接的设备
 */
-(void)disconnectActivePeripheral;

/**
 *  发送数据(加入buffers队列)
 *
 *  @param data 数据
 */
-(void)sendData:(NSData *)data;

/**
 *  发送数据命令(直接发送，不加入buffers)
 *
 *  @param data 数据
 */
-(void)sendDataMandatory:(NSData *)data;

/**
 设置Airblock的GPIO
 
 @param gpio GPIO口 1、2、3、4
 @param isHighLevel 是否为高电平
 */
-(void)setAirblockGPIO:(NSInteger)gpio isHighLevel:(BOOL)isHighLevel;

/**
 设置是否跳过蓝牙校验位
 
 @param escape 跳过/不跳过
 */
-(void)setAirblockEscapeCheck:(BOOL)escape;

/**
 设置通用GPIO口的高低
 
 @param gpio GPIO口 1\2\3\4
 @param isHigh 是否为高电平
 */
- (void)setCommonGPIO:(NSInteger)gpio isHigh:(BOOL)isHigh;

/**
 *  对mBot重命名
 *
 *  @param identifier peripheral的identifier
 *  @param alias      别名
 */
-(void)renameWithIdentifier:(NSString *)identifier andAlias:(NSString *)alias;

/**
 *  获取identifier对应的alias
 *
 *  @param identifier peripheral的identifier
 *
 *  @return 没有记录，返回nil
 */
-(NSString *)getAliasWithIdentifier:(NSString *)identifier;

@end
